package com.jiyun.jiyunmall.product.exception;

import com.jiyun.jiyunmall.common.utils.Result;
import com.jiyun.jiyunmall.common.utils.ResultCode;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 全局异常处理器
 *      JSR303校验异常，全局异常处理器
 * 全局异常处理器，就是AOP的实现，是springmvc进一步的分装：
 *  切面：
 *         切点：使用表达式，决定在哪里去执行切面的内容（通知）
 *         通知：增强的内容
 *   Controller  Advicespringmvc的进一步封装，切点：全体controller，通知：这里面写的所有
 *                  方法，比如：全局异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
//    @ResponseBody
    public Result bindingExceptionHandler(MethodArgumentNotValidException e) throws NoSuchFieldException, IllegalAccessException {
        System.out.println(e);
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        int errorCount = e.getBindingResult().getErrorCount();
        ArrayList<HashMap<String, String>> hashMaps = new ArrayList<>();
        if(errorCount>0){
            for (ObjectError allError : allErrors) {
                Object[] arguments = allError.getArguments();
                DefaultMessageSourceResolvable dmr = (DefaultMessageSourceResolvable)arguments[0];
                System.out.println(dmr.getDefaultMessage());
                 HashMap<String, String> map = new HashMap<>();
                map.put("name",dmr.getDefaultMessage());
                map.put("msg",allError.getDefaultMessage());
                hashMaps.add(map);
            }
            // 封住异常信息到map，并返回给前端
            Result error = new Result();
            error.setData(hashMaps);
            error.setMsg(ResultCode.BINDING_ERROR.getMsg());
            error.setCode(ResultCode.BINDING_ERROR.getCode());
           return error;
        }
        Result error = new Result();
        error.setCode(400);
        return  error;
    }

}
